package com.example.demo.common;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.UUID;

/**
 * 密码工具类
 * 加盐加密 / 加盐解密
 */
public class PasswordTools {

    /**
     * 加盐加密
     *
     * @param password 明文密码
     * @return 加盐加密的密码
     */
    public static String encrypt(String password) {
        // 1.产生盐值
        String salt = UUID.randomUUID().toString().replace("-", "");
        // 2.使用(盐值+明文密码)得到加密的密码
        String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // 3.将盐值和加密的密码共同返回（合并盐值和加密密码）
        String dbPassword = salt + "$" + finalPassword;
        return dbPassword;
    }

    /**
     * 加盐加密
     *
     * @param password 明文密码
     * @param salt     盐值
     * @return 加盐加密的密码
     */
    public static String encrypt(String password, String salt) {
        // 1.使用(盐值+明文密码)得到加密的密码
        String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // 2.将盐值和加密的密码共同返回（合并盐值和加密密码）
        String dbPassword = salt + "$" + finalPassword;
        return dbPassword;
    }

    /**
     * 自己写的 验证加盐加密密码
     *
     * @param password   明文密码（不一定对，需要验证明文密码）
     * @param dbPassword 数据库存储的密码（包含：salt+$+加盐加密密码）
     * @return true=密码正确
     */
    public static boolean decrypt(String password, String dbPassword) {
        boolean result = false;
        if (StringUtils.hasLength(password) && StringUtils.hasLength(dbPassword) &&
                dbPassword.length() == 65 && dbPassword.contains("$")) { // 参数正确
            // 1.得到盐值
            String[] passwrodArr = dbPassword.split("\\$");
            // 1.1 盐值
            String salt = passwrodArr[0];
//            // 1.2 得到正确密码的加盐加密密码
//            String finalPassword = passwrodArr[1];
            // 2.生成验证密码的加盐加密密码
            String checkPassword = encrypt(password, salt);
            if (dbPassword.equals(checkPassword)) {
                result = true;
            }
        }
        return result;
    }

    public static void main(String[] args) {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

        String password = "123";
//        encode 他是 Spring Security框架自带的加盐加密方法
//        String dbPwd = passwordEncoder.encode(password);
//        String dbPwd2 = passwordEncoder.encode(password);
//        String dbPwd3 = passwordEncoder.encode(password);
        String dbPwd = PasswordTools.encrypt(password);
        String dbPwd2 = PasswordTools.encrypt(password);
        String dbPwd3 = PasswordTools.encrypt(password);

        System.out.println(dbPwd);
        System.out.println(dbPwd2);
        System.out.println(dbPwd3);

        // 测试 加盐加密
        String cPwd = "12345"; // 设置一个错误的密码
//        boolean result = passwordEncoder.matches(cPwd, dbPwd2);
        boolean result = PasswordTools.decrypt(cPwd, dbPwd2);
        System.out.println("错误对比结果 -> " + result);


//        boolean result2 = passwordEncoder.matches(password, dbPwd2);
        boolean result2 = PasswordTools.decrypt(password, dbPwd2);
        System.out.println("正确对比结果 -> " + result2);

    }

}